// COCKPIT MAIN

cbuffer _Globals : register(b0)
{
  float4 g_vDefSettings : packoffset(c0);
  float4 ambient : packoffset(c1);
  float4 g_vDefLightDir : packoffset(c2);
  float4 g_vDefLightColor : packoffset(c3);
  float4 g_vDefSpecColor : packoffset(c4);
  int4 g_vnStartCascadeInstance : packoffset(c5) = {0,0,0,0};
  float4 g_vScreenDepthRect : packoffset(c6);
  float4x4 g_mCloudsShadowsSpace : packoffset(c7) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  float4 g_vCloudsShadowDesc : packoffset(c11) = {0,0,0,0};
  float4 g_vTexTransform : packoffset(c12);
  float4 g_vPerspZ : packoffset(c13);
  float4 g_vCamPos : packoffset(c14);
  float4 g_vPixelOffset : packoffset(c15);
  float4 g_vCamSetup : packoffset(c16) = {0,0,1,1};
  float4x4 g_mIView : packoffset(c17);
  float4x4 g_mView : packoffset(c21);
  float4x4 g_mCascadeLightSpace : packoffset(c25);
  float4 g_vCascadeUVTransform : packoffset(c29);
  float4 g_vCascadeZTransform : packoffset(c30);
  float4 g_vNoiseSetup : packoffset(c31);
}

cbuffer CBLightSettings : register(b1)
{

  struct
  {
    float4 vLightsListSettings2;
    float4 vShadowLODYPos;
    float4 vShadowLODXSZ;
    float4 vShadowLODYSZ;
    float4 vShadowTexRes;
  } g_LightListSettings : packoffset(c0);

  float4 g_avLODMask[4] : packoffset(c5);
  float4 g_avRot[6] : packoffset(c9);
}

cbuffer CBShadSettings : register(b2)
{

  struct
  {
    float4x4 mLightSpace;
    float4 vViewProjW;
    float4 vSmoothOffs;
    float4 vShadowsDesc;
    float4 avCascadeZ[2];
    float4 avUVTransform[8];
    float4 avZTransformZF[8];
  } g_ShadSettings : packoffset(c0);

}

cbuffer CBFog : register(b3)
{

  struct
  {
    float4 vDesc;
    float4 vFogLayerPlane;
    float4 vFogLayerColor;
    float4 vFogLayerSettings;
    float4 vFogColor;
    float4 vFogDistance;
    float4 vSunColor;
    float4 vAmbient;
  } g_FogDesc : packoffset(c0);

}

SamplerState AmbientSampler_s : register(s1);
SamplerState SSAOSampler_s : register(s3);
SamplerState CloudsShadowsSampler_s : register(s4);
SamplerState SkyLerpSampler_s : register(s5);
SamplerState LerpSampler_s : register(s6);
SamplerState LerpSamplerWrap_s : register(s7);
SamplerComparisonState LightsShadowsSampler_s : register(s0);
SamplerComparisonState shadowSamplerF_s : register(s2);
TextureCube<float4> AmbientSampler : register(t0);
Texture2D<float4> SSAOSampler : register(t1);
Buffer<float4> g_bufLightsInfo : register(t2);
Texture2D<float4> g_tLightsShadows : register(t3);
Texture3D<uint2> g_tLightsList : register(t4);
Texture2D<float4> g_tDepthTexture : register(t5);
Texture2D<float4> g_tCloudsShadowsTexture : register(t6);
Texture2DArray<float4> g_tSky : register(t7);
Texture2D<float4> g_tms1Albedo : register(t8);
Texture2D<float4> g_tms1Normals : register(t9);
Texture2D<float4> g_tms1SpecRef : register(t10);
Texture2D<float4> g_tms1SelfLight : register(t11);
Texture2D<float4> g_tms1Depth : register(t12);
Texture2D<float4> g_tWaterReflection : register(t13);
Texture2D<float4> g_t2Shadow : register(t14);
Texture2D<float4> g_tNoise : register(t15);
TextureCube<float4> g_tReflection : register(t16);


// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
  float4 v0 : SV_Position0,
  float2 v1 : TEXCOORD0,
  float2 w1 : TEXCOORD1,
  float2 v2 : TEXCOORD2,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26; //r25+r26 new
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v1.xy;
  r0.zw = float2(0,0);
  r1.xyzw = g_tms1Albedo.Load(r0.xyw).xyzw;
  r2.xyz = g_tms1Normals.Load(r0.xyw).xyz;
  r2.w = dot(r2.xyz, float3(1,1,1));
  r2.w = cmp(0 >= r2.w);
  r2.xyz = r2.xyz * float3(2,2,2) + float3(-1,-1,-1);
  r3.x = dot(r2.xyz, r2.xyz);
  r3.y = rsqrt(r3.x);
  r2.xyz = r3.yyy * r2.xyz;
  r3.y = g_tms1Depth.Load(r0.xyw).x;
  r3.y = -g_vPerspZ.z + r3.y;
  r4.z = g_vPerspZ.w / r3.y;
  r4.xy = v2.xy * r4.zz;
  r4.w = 1;
  r5.x = dot(r4.xyzw, g_mIView._m00_m10_m20_m30);
  r5.y = dot(r4.xyzw, g_mIView._m01_m11_m21_m31);
  r5.z = dot(r4.xyzw, g_mIView._m02_m12_m22_m32);
  r3.yzw = g_vCamPos.xyz + -r5.xyz;
  r4.x = dot(r3.yzw, r3.yzw);
  r4.x = rsqrt(r4.x);
  r6.xyz = r4.xxx * r3.yzw;
  r5.w = 1;
  r7.x = dot(r5.xyzw, g_mCascadeLightSpace._m00_m10_m20_m30);
  r7.y = dot(r5.xyzw, g_mCascadeLightSpace._m01_m11_m21_m31);
  r4.yw = r7.xy * g_vCascadeUVTransform.zw + g_vCascadeUVTransform.xy;
  r7.xy = g_vNoiseSetup.xy * r4.yw;
  r7.xy = g_tNoise.Sample(LerpSamplerWrap_s, r7.xy).xy;
  r8.xyz = AmbientSampler.Sample(AmbientSampler_s, r2.xyz).xyz;
  r7.zw = w1.xy * g_vScreenDepthRect.zw + g_vScreenDepthRect.xy;
  r6.w = SSAOSampler.Sample(SSAOSampler_s, r7.zw).y;
  r7.z = dot(-r6.xyz, r2.xyz);
  r7.z = r7.z + r7.z;
  r9.xyz = r2.xyz * -r7.zzz + -r6.xyz;
  r9.w = -r9.y;
  r10.xyz = r3.yzw * r4.xxx + r9.xwz;
  r11.x = dot(r10.xyz, g_mView._m00_m10_m20);
  r7.z = dot(r10.xyz, g_mView._m01_m11_m21);
  r11.y = -r7.z;
  r7.z = saturate(r6.y);
  r7.z = 1 + -r7.z;
  r7.z = log2(r7.z);
  r7.z = 16 * r7.z;
  r7.z = exp2(r7.z);
  r7.z = 1 + -r7.z;
  r7.zw = r11.xy * r7.zz;
  r7.zw = r7.zw * float2(0.125,0.125) + w1.xy;
  r10.xyz = g_tWaterReflection.Sample(LerpSampler_s, r7.zw).xyz;
  if (r2.w != 0) {
    o0.xyzw = r1.xyzw;
  } else {
    r1.w = cmp(r3.x < 0.970000029);
    if (r1.w != 0) {
      r1.w = sqrt(r3.x);
      r1.w = -0.25 + r1.w;
      r1.w = saturate(1.33333337 * r1.w);
    } else {
      r1.w = 1;
    }
    r11.xyzw = g_tms1SelfLight.Load(r0.xyw).xyzw;
    r0.xyzw = g_tms1SpecRef.Load(r0.xyz).zxyw;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
r25.w = r0.y; // new
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    r12.x = dot(r5.xyzw, g_mCloudsShadowsSpace._m00_m10_m20_m30);
    r2.w = dot(r5.xyzw, g_mCloudsShadowsSpace._m01_m11_m21_m31);
    r12.y = dot(r5.xyzw, g_mCloudsShadowsSpace._m02_m12_m22_m32);
    r2.w = -g_vCloudsShadowDesc.x + r2.w;
    r2.w = -r2.w * g_vCloudsShadowDesc.y + 1;
    r13.xyz = -g_vCamPos.xyz + r5.xyz;
    r3.x = dot(r13.xyz, r13.xyz);
    r3.x = sqrt(r3.x);
    r3.x = 0.0500000007 * r3.x;
    r7.z = dot(r2.xyz, r13.xyz);
    r14.x = g_vPixelOffset.x + v2.x;
    r14.y = v2.y;
    r14.zw = float2(1,1);
    r15.x = dot(r14.xyz, g_mIView._m00_m10_m20);
    r15.y = dot(r14.xyz, g_mIView._m01_m11_m21);
    r15.z = dot(r14.xyz, g_mIView._m02_m12_m22);
    r7.w = dot(r15.xyz, r15.xyz);
    r7.w = rsqrt(r7.w);
    r14.xyz = r15.xyz * r7.www;
    r15.xyz = r14.xyz * r7.zzz;
    r7.w = dot(r2.xyz, r14.xyz);
    r14.xyz = r15.xyz / r7.www;
    r14.xyz = r14.xyz + -r13.xyz;
    r7.w = dot(r14.xyz, r14.xyz);
    r3.x = r3.x * r3.x;
    r8.w = cmp(r3.x < r7.w);
    if (r8.w != 0) {
      r7.w = r3.x / r7.w;
      r7.w = sqrt(r7.w);
      r14.xyz = r14.xyz * r7.www;
    }
    r14.xyz = r14.xyz + r5.xyz;
    r15.x = dot(r14.xyzw, g_mCloudsShadowsSpace._m00_m10_m20_m30);
    r15.y = dot(r14.xyzw, g_mCloudsShadowsSpace._m02_m12_m22_m32);
    r14.x = v2.x;
    r14.y = g_vPixelOffset.y + v2.y;
    r14.z = 1;
    r16.x = dot(r14.xyz, g_mIView._m00_m10_m20);
    r16.y = dot(r14.xyz, g_mIView._m01_m11_m21);
    r16.z = dot(r14.xyz, g_mIView._m02_m12_m22);
    r7.w = dot(r16.xyz, r16.xyz);
    r7.w = rsqrt(r7.w);
    r14.xyz = r16.xyz * r7.www;
    r16.xyz = r14.xyz * r7.zzz;
    r7.z = dot(r2.xyz, r14.xyz);
    r14.xyz = r16.xyz / r7.zzz;
    r13.xyz = r14.xyz + -r13.xyz;
    r7.z = dot(r13.xyz, r13.xyz);
    r7.w = cmp(r3.x < r7.z);
    if (r7.w != 0) {
      r3.x = r3.x / r7.z;
      r3.x = sqrt(r3.x);
      r13.xyz = r13.xyz * r3.xxx;
    }
    r13.xyz = r13.xyz + r5.xyz;
    r13.w = 1;
    r14.x = dot(r13.xyzw, g_mCloudsShadowsSpace._m00_m10_m20_m30);
    r14.y = dot(r13.xyzw, g_mCloudsShadowsSpace._m02_m12_m22_m32);
    r7.zw = r15.xy + -r12.xy;
    r12.zw = r14.xy + -r12.xy;
    r12.xyz = g_tCloudsShadowsTexture.SampleGrad(CloudsShadowsSampler_s, r12.xy, r7.zwz, r12.zwz).yzw;
    r3.x = -r12.y + r2.w;
    r3.x = saturate(50 * r3.x);
    r7.z = -1 + r12.x;
    r7.z = r3.x * r7.z + 1;
    r7.w = r12.y + r12.z;
    r2.w = saturate(r7.w + -r2.w);
    r2.w = r3.x * r2.w;
    r1.w = r7.z * r1.w;
    r12.xy = cmp(float2(0,0) < r0.xw);
    r13.xy = cmp(float2(0.100000001,0.0500000007) >= r0.ww);
    r3.x = (int)r12.x | (int)r13.x;
    if (r3.x != 0) {
      r14.x = dot(r5.xyzw, g_ShadSettings.mLightSpace._m00_m10_m20_m30);
      r14.y = dot(r5.xyzw, g_ShadSettings.mLightSpace._m01_m11_m21_m31);
      r3.x = dot(r5.xyzw, g_ShadSettings.mLightSpace._m02_m12_m22_m32);
      r7.w = dot(g_ShadSettings.vViewProjW.xyzw, r5.xyzw);
      r15.xyzw = cmp(g_ShadSettings.avCascadeZ[0].xyzw < r7.wwww);
      r15.xyzw = r15.xyzw ? float4(1,1,1,1) : 0;
      r8.w = dot(float4(1,1,1,1), r15.xyzw);
      r15.xyzw = cmp(g_ShadSettings.avCascadeZ[1].xyzw < r7.wwww);
      r15.xyzw = r15.xyzw ? float4(1,1,1,1) : 0;
      r9.w = dot(float4(1,1,1,1), r15.xyzw);
      r8.w = r9.w + r8.w;
      r9.w = (uint)r8.w;
      r13.xz = r14.xy * g_ShadSettings.avUVTransform[r9.w].zw + g_ShadSettings.avUVTransform[r9.w].xy;
      r10.w = r3.x * g_ShadSettings.avZTransformZF[r9.w].y + g_ShadSettings.avZTransformZF[r9.w].x;
      r12.w = g_ShadSettings.vShadowsDesc.z * r7.w;
      r15.xyzw = cmp(g_ShadSettings.avCascadeZ[0].xyzw < r12.wwww);
      r15.xyzw = r15.xyzw ? float4(1,1,1,1) : 0;
      r13.w = dot(float4(1,1,1,1), r15.xyzw);
      r15.xyzw = cmp(g_ShadSettings.avCascadeZ[1].xyzw < r12.wwww);
      r15.xyzw = r15.xyzw ? float4(1,1,1,1) : 0;
      r12.w = dot(float4(1,1,1,1), r15.xyzw);
      r12.w = r13.w + r12.w;
      r8.w = cmp(r8.w < r12.w);
      if (r8.w != 0) {
        r8.w = (uint)r12.w;
        r14.xy = r14.xy * g_ShadSettings.avUVTransform[r8.w].zw + g_ShadSettings.avUVTransform[r8.w].xy;
        r3.x = r3.x * g_ShadSettings.avZTransformZF[r8.w].y + g_ShadSettings.avZTransformZF[r8.w].x;
        r7.w = -g_ShadSettings.avZTransformZF[r9.w].w * g_ShadSettings.vShadowsDesc.w + r7.w;
        r8.w = -g_ShadSettings.avZTransformZF[r9.w].w * g_ShadSettings.vShadowsDesc.w + g_ShadSettings.avZTransformZF[r9.w].w;
        r7.w = r7.w / r8.w;
      } else {
        r14.xy = r13.xz;
        r3.x = r10.w;
        r7.w = 0;
      }
      r8.w = cmp(0 < r7.w);
      r9.w = 0;
      r12.w = -1;
      while (true) {
        r13.w = cmp(1 < (int)r12.w);
        if (r13.w != 0) break;
        r15.y = (int)r12.w;
        r13.w = r9.w;
        r14.z = -1;
        while (true) {
          r14.w = cmp(1 < (int)r14.z);
          if (r14.w != 0) break;
          r15.x = (int)r14.z;
          r15.zw = r15.xy * g_ShadSettings.vSmoothOffs.xy + r13.xz;
          r14.w = g_tDepthTexture.SampleCmpLevelZero(shadowSamplerF_s, r15.zw, r10.w).x;
          if (r8.w != 0) {
            r15.xz = r15.xy * g_ShadSettings.vSmoothOffs.xy + r14.xy;
            r15.x = g_tDepthTexture.SampleCmpLevelZero(shadowSamplerF_s, r15.xz, r3.x).x;
            r15.x = r15.x + -r14.w;
            r14.w = r7.w * r15.x + r14.w;
          }
          r13.w = r14.w + r13.w;
          r14.z = (int)r14.z + 1;
        }
        r9.w = r13.w;
        r12.w = (int)r12.w + 1;
      }
      r3.x = 0.111111112 * r9.w;
      r7.w = dot(r5.xyzw, g_mCascadeLightSpace._m02_m12_m22_m32);
      r7.w = r7.w * g_vCascadeZTransform.y + g_vCascadeZTransform.x;
      r7.xy = float2(-0.5,-0.5) + r7.xy;
      r7.xy = g_vNoiseSetup.zw * r7.xy;
      r4.yw = r7.xy * float2(2,2) + r4.yw;
      r14.xw = g_vNoiseSetup.zw;
      r14.yz = float2(0,0);
      r15.xyzw = r14.xyzw + r4.ywyw;
      r7.x = g_t2Shadow.SampleCmpLevelZero(shadowSamplerF_s, r15.xy, r7.w).x;
      r14.xyzw = -r14.xyzw + r4.ywyw;
      r4.y = g_t2Shadow.SampleCmpLevelZero(shadowSamplerF_s, r14.xy, r7.w).x;
      r4.y = r7.x + r4.y;
      r4.w = g_t2Shadow.SampleCmpLevelZero(shadowSamplerF_s, r15.zw, r7.w).x;
      r4.y = r4.y + r4.w;
      r4.w = g_t2Shadow.SampleCmpLevelZero(shadowSamplerF_s, r14.zw, r7.w).x;
      r4.y = r4.y + r4.w;
      r3.x = r4.y * r3.x;
      r4.y = 0.25 * r3.x;
      r4.w = -g_ShadSettings.vShadowsDesc.x + r4.z;
      r4.w = saturate(g_ShadSettings.vShadowsDesc.y * r4.w);
      r3.x = -r3.x * 0.25 + 1;
      r3.x = r4.w * r3.x + r4.y;
      r1.w = r3.x * r1.w;
    }
    r3.x = cmp(0.5 < ambient.w);
    if (r3.x != 0) {
      r3.x = max(ambient.y, ambient.z);
      r3.x = max(ambient.x, r3.x);
      r4.y = max(r8.y, r8.z);
      r4.y = max(r8.x, r4.y);
      r4.w = cmp(r4.y < r3.x);
      if (r4.w != 0) {
        r3.x = r3.x / r4.y;
        r8.xyz = r8.xyz * r3.xxx;
      }
    } else {
      r8.xyz = ambient.xyz;
    }
    r7.xyw = r12.yyy ? ambient.xyz : r8.xyz;
    r3.x = r12.y ? r13.y : 0;
    r4.yw = cmp(r0.xw == float2(0,0));
    if (r4.y != 0) {
      r4.y = 1 + -r0.w;
      r4.y = saturate(1.11111116 * r4.y);
      r8.x = 1 + -r4.y;
      r7.xyw = g_vDefLightColor.xyz * r8.xxx + r7.xyw;
      r8.xyz = g_vDefLightColor.xyz * r4.yyy;
    } else {
      r8.xyz = g_vDefLightColor.xyz;
    }
    r4.y = dot(r7.xyw, float3(0.166500002,0.166500002,0.166500002));
    r2.w = r12.z * r2.w;
    r13.xyz = r4.yyy + -r7.xyw;
    r7.xyw = r2.www * r13.xyz + r7.xyw;
    r2.w = dot(ambient.xyz, float3(0.333000004,0.333000004,0.333000004));
    r2.w = -0.5 + r2.w;
    r2.w = saturate(-r2.w * 5 + 1);
    r2.w = r2.w * r11.w;
    r4.y = 255 * r0.z;
    r0.z = r0.z * 255 + 0.5;
    r0.z = floor(r0.z);
    r8.w = 0.03125 * r0.z;
    r8.w = floor(r8.w);
    r0.z = -r8.w * 32 + r0.z;
    r0.z = 0.0322580636 * r0.z;
    r0.z = r0.z * r0.z;
    r13.x = 250 * r0.z;
    r0.z = r13.x * r8.w;
    r13.y = 0.142857149 * r0.z;
    r4.yw = r4.ww ? r13.xy : r4.yy;
    r12.zw = g_LightListSettings.vLightsListSettings2.xy * w1.xy;
    r13.yz = (int2)r12.zw;
    r13.w = 0;
    r12.zw = g_tLightsList.Load(r13.yzww).xy;
    r0.z = min(17, (uint)r12.w);
    r8.w = cmp(0.5 < g_LightListSettings.vLightsListSettings2.w);
    r14.xyz = float3(0,0,0);
    r15.xyz = float3(0,0,0);
    r9.w = 1;
    r13.x = 0;
    r10.w = r12.z;
    while (true) {
      r11.w = cmp((int)r9.w >= (int)r0.z);
      if (r11.w != 0) break;
      if (r9.w != 0) {
        r13.x = (int)r13.x + 1;
        r10.w = g_tLightsList.Load(r13.yzxw).x;
      }
      r11.w = (uint)r10.w << 3;
      r16.xyzw = g_bufLightsInfo.Load(r11.w).xyzw;
      bitmask.w = ((~(-1 << 29)) << 3) & 0xffffffff;  r11.w = (((uint)r10.w << 3) & bitmask.w) | ((uint)1 & ~bitmask.w);
      r17.xyzw = g_bufLightsInfo.Load(r11.w).xywz;
      r18.xy = cmp(r17.xy >= float2(100,100));
      if (r18.x != 0) {
        r17.x = -100 + r17.x;
      }
      if (r18.y != 0) {
        r17.y = -100 + r17.y;
      }
      r12.w = cmp(1 < r16.w);
      if (r12.w != 0) {
        r19.xyz = r16.xyz + -r5.xyz;
        r12.w = dot(r19.xyz, r19.xyz);
        r14.w = sqrt(r12.w);
        r19.xyz = r19.xyz / r14.www;
        r12.w = r12.w * r17.z + 1;
        r12.w = 1 / r12.w;
        r12.w = -0.100000001 + r12.w;
        r12.w = saturate(1.11111116 * r12.w);
        r14.w = (int)r11.w + 1;
        r15.w = cmp(2 < r16.w);
        if (r15.w != 0) {
          r20.xyzw = g_bufLightsInfo.Load(r14.w).xyzw;
          r16.w = -3 + r16.w;
          r18.z = dot(r19.xyz, r20.xyz);
          r18.w = 1 + -abs(r18.z);
          r18.w = sqrt(r18.w);
          r19.w = abs(r18.z) * -0.0187292993 + 0.0742610022;
          r19.w = r19.w * abs(r18.z) + -0.212114394;
          r19.w = r19.w * abs(r18.z) + 1.57072878;
          r20.x = r19.w * r18.w;
          r20.x = r20.x * -2 + 3.14159274;
          r18.z = cmp(r18.z < -r18.z);
          r18.z = r18.z ? r20.x : 0;
          r18.z = r19.w * r18.w + r18.z;
          r18.w = cmp(r18.z < r16.w);
          if (r18.w != 0) {
            r18.w = frac(r20.w);
            r16.w = r18.z / r16.w;
            r16.w = r16.w + -r18.w;
            r18.z = 1 + -r18.w;
            r16.w = saturate(r16.w / r18.z);
            r16.w = 1 + -r16.w;
          } else {
            r16.w = 0;
          }
          r12.w = r16.w * r12.w;
          r16.w = cmp(0 < r12.w);
          r18.z = cmp(r20.w >= 1);
          r16.w = r16.w ? r18.z : 0;
          if (r16.w != 0) {
            r16.w = (int)r20.w;
            r16.w = (int)r16.w + -1;
          } else {
            r16.w = -1;
          }
          r20.xyz = r5.xyz;
        } else {
          r18.z = cmp(0 < r12.w);
          r18.y = r18.z ? r18.y : 0;
          if (r18.y != 0) {
            r14.w = g_bufLightsInfo.Load(r14.w).w;
            r18.y = cmp(r14.w >= 1);
            if (r18.y != 0) {
              r14.w = (int)r14.w;
              r14.w = (int)r14.w + -1;
              r18.yzw = -r16.xyz + r5.xyz;
              r21.xy = cmp(abs(r18.yw) < r18.zz);
              r19.w = r21.y ? r21.x : 0;
              if (r19.w != 0) {
                r19.w = 4;
              } else {
                r21.xy = cmp(r18.zz < -abs(r18.yw));
                r20.w = r21.y ? r21.x : 0;
                if (r20.w != 0) {
                  r19.w = 5;
                } else {
                  r20.w = cmp(abs(r18.y) < r18.w);
                  if (r20.w != 0) {
                    r19.w = 0;
                  } else {
                    r20.w = cmp(r18.w < -abs(r18.y));
                    if (r20.w != 0) {
                      r19.w = 2;
                    } else {
                      r20.w = cmp(r18.y >= 0);
                      if (r20.w != 0) {
                        r19.w = 1;
                      } else {
                        r19.w = 3;
                      }
                    }
                  }
                }
              }
              r20.w = cmp((uint)r19.w < 4);
              if (r20.w != 0) {
                r21.x = dot(r18.yw, g_avRot[r19.w].xy);
                r21.z = dot(r18.yw, g_avRot[r19.w].zw);
                r21.y = r18.z;
              } else {
                r21.y = dot(r18.zw, g_avRot[r19.w].xy);
                r21.z = dot(r18.zw, g_avRot[r19.w].zw);
                r21.x = r18.y;
              }
              r20.xyz = r21.xyz + r16.xyz;
              r16.w = (int)r14.w + (int)r19.w;
            } else {
              r16.w = -1;
              r20.xyz = r5.xyz;
            }
          } else {
            r16.w = -1;
            r20.xyz = r5.xyz;
          }
        }
        r14.w = cmp((int)r16.w >= 0);
        if (r14.w != 0) {
          r11.w = (int)r11.w + 3;
          r21.xyzw = g_bufLightsInfo.Load(r11.w).xyzw;
          r11.w = (int)r11.w | 5;
          r22.xyzw = g_bufLightsInfo.Load(r11.w).xyzw;
          r11.w = (int)r11.w + 1;
          r23.xyzw = g_bufLightsInfo.Load(r11.w).xyzw;
          r11.w = (int)r11.w | 7;
          r24.xyzw = g_bufLightsInfo.Load(r11.w).xyzw;
          r22.xyzw = r22.xyzw * r20.yyyy;
          r21.xyzw = r20.xxxx * r21.xyzw + r22.xyzw;
          r20.xyzw = r20.zzzz * r23.xyzw + r21.xyzw;
          r20.xyzw = r20.xyzw + r24.xyzw;
          r18.yzw = r20.xyz / r20.www;
          r20.xy = cmp(float2(1,1) < abs(r18.yz));
          r11.w = (int)r20.y | (int)r20.x;
          if (r11.w != 0) {
            r14.w = 0;
          }
          if (r11.w == 0) {
            r11.w = r18.y * 0.5 + 0.5;
            r18.y = -r18.z * 0.5 + 0.5;
            r18.z = (uint)r16.w >> 5;
            r16.w = (int)r16.w & 31;
            r19.w = dot(g_LightListSettings.vShadowLODXSZ.xyzw, g_avLODMask[r18.z].xyzw);
            if (r15.w == 0) {
              r20.x = g_LightListSettings.vShadowTexRes.x * r19.w;
              r20.x = 0.5 / r20.x;
              r20.y = 1 + -r20.x;
              r20.z = max(r20.x, r11.w);
              r11.w = min(r20.z, r20.y);
              r20.x = max(r20.x, r18.y);
              r18.y = min(r20.x, r20.y);
            }
            r16.w = (uint)r16.w;
            r11.w = r16.w + r11.w;
            r20.x = r11.w * r19.w;
            r11.w = dot(g_LightListSettings.vShadowLODYPos.xyzw, g_avLODMask[r18.z].xyzw);
            r16.w = dot(r18.yy, r19.ww);
            r20.y = r16.w + r11.w;
            r14.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r20.xy, r18.w).x;
            r11.w = r8.w ? r15.w : 0;
            if (r11.w != 0) {
              r21.yz = -g_LightListSettings.vShadowTexRes.zw + r20.xy;
              r11.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.yz, r18.w).x;
              r11.w = r14.w + r11.w;
              r21.xw = g_LightListSettings.vShadowTexRes.zw + r20.xy;
              r15.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.xz, r18.w).x;
              r11.w = r15.w + r11.w;
              r15.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.yw, r18.w).x;
              r11.w = r15.w + r11.w;
              r15.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.xw, r18.w).x;
              r11.w = r15.w + r11.w;
              r14.w = 0.200000003 * r11.w;
            }
          }
          r12.w = r14.w * r12.w;
        }
        r16.xyz = r19.xyz;
      } else {
        r16.xyz = -r16.xyz;
        r12.w = 1;
      }
      r11.w = cmp(0 < r12.w);
      if (r11.w != 0) {
        r11.w = ~(int)r18.x;
        r14.w = dot(r16.xyz, r2.xyz);
        r15.w = cmp(0 < r14.w);
        if (r15.w != 0) {
          r17.z = r17.w;
          r18.xyz = r17.xyz * r14.www;
          r18.xyz = r18.xyz * r12.www;
        } else {
          r18.xyz = float3(0,0,0);
        }
        r11.w = r11.w ? r15.w : 0;
        if (r11.w != 0) {
          r16.xyz = r3.yzw * r4.xxx + r16.xyz;
          r16.xyz = float3(0.5,0.5,0.5) * r16.xyz;
          r11.w = dot(r16.xyz, r16.xyz);
          r11.w = rsqrt(r11.w);
          r16.xyz = r16.xyz * r11.www;
          r11.w = dot(r16.xyz, r2.xyz);
          r15.w = cmp(0.00400000019 < r11.w);
          if (r15.w != 0) {
            r11.w = log2(r11.w);
            r11.w = r11.w * r4.y;
            r11.w = exp2(r11.w);
            r12.w = sqrt(r12.w);
            r11.w = r12.w * r11.w;
            r16.xyz = r17.xyw * r11.www;
            r16.xyz = r16.xyz * r0.yyy;
            r11.w = saturate(10 * r14.w);
            r16.xyz = r16.xyz * r11.www;
          } else {
            r16.xyz = float3(0,0,0);
          }
        } else {
          r16.xyz = float3(0,0,0);
        }
        r14.xyz = r18.xyz + r14.xyz;
        r15.xyz = r16.xyz + r15.xyz;
      }
      r9.w = (int)r9.w + 1;
    }
    r0.z = dot(g_vDefLightDir.xyz, r2.xyz);
    if (r3.x != 0) {
      r8.w = cmp(-r0.z < 0);
      if (r8.w != 0) {
        r8.w = (int)r3.x & 0x3f800000;
        r6.x = dot(r6.xyz, r2.xyz);
        r6.x = r6.x * r8.w;
        r0.z = r6.x * r0.z;
      } else {
        r0.z = -r0.z;
      }
      r6.x = 1 + -r0.z;
      r3.x = r3.x ? 0.5 : 1;
      r0.z = -r6.x * r3.x + 1;
    } else {
      r0.z = -r0.z;
    }
    r3.x = saturate(r0.z);
    r6.xyz = r8.xyz * r3.xxx;
    r3.xyz = r3.yzw * r4.xxx + -g_vDefLightDir.xyz;
    r3.xyz = float3(0.5,0.5,0.5) * r3.xyz;
    r3.w = dot(r3.xyz, r3.xyz);
    r3.w = rsqrt(r3.w);
    r3.xyz = r3.xyz * r3.www;
    r2.x = dot(r3.xyz, r2.xyz);
    r2.x = max(0, r2.x);
    r2.y = cmp(0.00400000019 < r2.x);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////   spec
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    r25.y = r25.w * r25.w;             /// UE style spec to roughness approx
    r25.x = r25.y * 1024;               /// kinda jank
    r25.w = saturate(r25.y * 4.0);              /// will need to tweak some outputs manually
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if (r2.y != 0) {
      r2.x = log2(r2.x);
             // r2.xy = r4.yw * r2.xx;  /// orig
                r2.xy = r25.xx * r2.xx; /// exponent from text
      r2.xy = exp2(r2.xy);
             // r2.x = dot(r2.xy, float2(0.5,0.5)); // ?????
             //r2.xyz = g_vDefSpecColor.xyz * r2.xxx; // orig
                r2.xyz = g_FogDesc.vSunColor.xyz * r2.xxx; // using suncolor for consistency not sure if defspec is always the same
             // r2.xyz = r2.xyz * r0.yyy;   /// orig
                r2.xyz = r2.xyz * r25.www;  /// power
             // r0.y = saturate(10 * r0.z); /// orig
             // r2.xyz = r2.xyz * r0.yyy;
    } else {
      r2.xyz = float3(0,0,0);
    }
   // o0.xyz = r2.xyz;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    r3.xyz = r14.xyz + r11.xyz;
    r0.y = r4.z * 0.00666666683 + -0.75;
    r0.y = saturate(4 * r0.y);
    r0.z = 1 + -r6.w;
    r0.y = r0.y * r0.z + r6.w;
    r0.z = r0.y * r0.y;
    r0.y = -r0.y * r0.y + r0.y;
    r0.y = r7.z * r0.y + r0.z;
    r3.xyz = r6.xyz * r1.www + r3.xyz;
    r3.xyz = r0.yyy * r7.xyw + r3.xyz;
    r4.xyz = float3(0.400000006,1,0.800000012) * r2.www;
    r3.xyz = max(r4.xyz, r3.xyz);
    r4.xyz = r3.xyz * r1.xyz;
    if (r12.x != 0) {
      r0.y = cmp(r0.w < 1);
      if (r0.y != 0) {
        r6.xyz = g_tReflection.SampleLevel(LerpSampler_s, r9.xyz, 3).xyz;
      } else {
        r6.xyz = float3(0,0,0);
      }
      if (r12.y != 0) {
        r7.xyz = r10.xyz + -r6.xyz;
        r6.xyz = r0.www * r7.xyz + r6.xyz;
      }
    } else {
      r6.xyz = float3(0,0,0);
      r0.x = 0;
    }
    r0.yzw = -r3.xyz * r1.xyz + r6.xyz;
    r0.xyz = r0.xxx * r0.yzw + r4.xyz;
    r1.xyz = r2.xyz * r1.www + r15.xyz;
    r0.xyz = r1.xyz + r0.xyz;
    r0.w = dot(r5.xyz, r5.xyz);
    r0.w = sqrt(r0.w);
    r0.w = g_FogDesc.vFogDistance.x * r0.w;
    r0.w = min(1, r0.w);
    r1.x = dot(r5.xyzw, g_FogDesc.vFogLayerPlane.xyzw);
    r1.y = cmp(g_FogDesc.vDesc.z >= 0);
    if (r1.y != 0) {
      r1.z = cmp(r1.x < -g_FogDesc.vFogLayerSettings.y);
      if (r1.z != 0) {
        r1.x = -g_FogDesc.vFogLayerSettings.y;
      }
      r1.z = cmp(r1.x < 0);
      if (r1.z != 0) {
        r1.z = dot(-r5.xyz, -r5.xyz);
        r1.z = rsqrt(r1.z);
        r2.xyz = -r5.xyz * r1.zzz;
        r1.z = dot(g_FogDesc.vFogLayerPlane.xyz, r2.xyz);
        r1.w = cmp(0 < r1.z);
        if (r1.w != 0) {
          r1.z = 1 / r1.z;
          r2.z = -r1.x;
          r1.w = g_FogDesc.vDesc.z + r2.z;
          r2.w = g_FogDesc.vDesc.z * r1.z;
          r1.z = r1.w * r1.z + -r2.w;
          r1.w = r1.x * r1.x;
          r1.z = r1.z * r1.z + -r1.w;
          r2.y = sqrt(abs(r1.z));
        } else {
          r2.yz = float2(0,0);
        }
      } else {
        r2.yz = float2(0,0);
      }
      r2.x = 0;
      r1.z = 0;
    } else {
      r1.w = dot(-r5.xyz, -r5.xyz);
      r1.w = rsqrt(r1.w);
      r3.xyz = -r5.xyz * r1.www;
      r1.w = dot(g_FogDesc.vFogLayerPlane.xyz, r3.xyz);
      r2.w = cmp(0 < abs(r1.w));
      if (r2.w != 0) {
        r1.w = -g_FogDesc.vDesc.z / abs(r1.w);
        r2.w = cmp(r1.x >= 0);
        if (r2.w != 0) {
          r2.w = g_FogDesc.vDesc.z * g_FogDesc.vDesc.z;
          r2.w = r1.w * r1.w + -r2.w;
          r2.y = sqrt(abs(r2.w));
          r2.z = -g_FogDesc.vDesc.z;
          r1.z = 0;
        } else {
          r2.w = dot(-r5.xyz, -r5.xyz);
          r2.w = sqrt(r2.w);
          r3.x = cmp(r3.y < 0);
          if (r3.x != 0) {
            r3.x = g_FogDesc.vDesc.z * g_FogDesc.vDesc.z;
            r3.x = r1.w * r1.w + -r3.x;
            r2.y = sqrt(abs(r3.x));
            r3.x = -r2.w + r1.w;
            r3.x = r3.x * r2.y;
            r1.z = r3.x / r1.w;
            r2.z = -g_FogDesc.vDesc.z;
          } else {
            r2.z = -r1.x;
            r2.w = r2.w + r1.w;
            r1.x = r1.x * r1.x;
            r1.x = r2.w * r2.w + -r1.x;
            r2.y = sqrt(abs(r1.x));
            r1.x = r2.y * r1.w;
            r1.z = r1.x / r2.w;
          }
        }
        r2.x = 0;
      } else {
        r1.x = dot(-r5.xyz, -r5.xyz);
        r2.y = sqrt(r1.x);
        r2.x = -g_FogDesc.vDesc.z;
        r2.z = 9.99999975e-005;
        r1.z = 0;
      }
    }
    r1.x = cmp(0 >= r2.y);
    if (r1.x != 0) {
      r1.w = 0;
    }
    if (r1.x == 0) {
      r1.x = r2.z / r2.y;
      r2.y = r2.y + -r1.z;
      r2.w = 0.0399999991 * r1.x;
      r2.w = 1 / r2.w;
      r2.z = -r2.z + -r2.x;
      r2.z = 0.0577078015 * r2.z;
      r2.z = exp2(r2.z);
      r1.x = -r1.z * r1.x + -r2.x;
      r1.x = 0.0577078015 * r1.x;
      r1.x = exp2(r1.x);
      r1.x = r2.z + -r1.x;
      r1.x = r2.w * r1.x + r2.y;
      r1.x = g_FogDesc.vFogLayerSettings.x * r1.x;
      r1.x = -1.44269502 * r1.x;
      r1.x = exp2(r1.x);
      r1.w = 1 + -r1.x;
    }
    r1.x = dot(g_FogDesc.vFogColor.xyz, float3(1,1,1));
    r1.x = cmp(0.00100000005 < r1.x);
    r1.z = log2(r0.w);
    r1.z = g_FogDesc.vDesc.x * r1.z;
    r1.z = exp2(r1.z);
    r2.xyz = g_FogDesc.vFogColor.xyz * r1.zzz;
    r2.xyz = log2(r2.xyz);
    r2.xyz = g_FogDesc.vFogColor.www * r2.xyz;
    r2.xyz = exp2(r2.xyz);
    r2.xyz = float3(-1.44269502,-1.44269502,-1.44269502) * r2.xyz;
    r2.xyz = exp2(r2.xyz);
    r2.xyz = float3(1,1,1) + -r2.xyz;
    r1.z = cmp(0.800000012 < r0.w);
    r1.x = r1.x ? r1.z : 0;
    if (r1.x != 0) {
      r0.w = -0.800000012 + r0.w;
      r0.w = 5 * r0.w;
      r3.xyz = float3(1,1,1) + -r2.xyz;
      r2.xyz = r0.www * r3.xyz + r2.xyz;
    }
    r0.w = -0.25 + g_FogDesc.vFogDistance.w;
    r0.w = r0.w + r0.w;
    r1.x = dot(r2.xyz, float3(0.333299994,0.333299994,0.333299994));
    r3.xyz = r1.xxx + -r2.xyz;
    r2.xyz = r0.www * r3.xyz + r2.xyz;
    r3.xy = w1.xy;
    r3.z = 0;
    r3.xyzw = g_tSky.SampleLevel(SkyLerpSampler_s, r3.xyz, 0).xyzw;
    r4.xy = w1.xy;
    r4.z = 1;
    r4.xyzw = g_tSky.SampleLevel(SkyLerpSampler_s, r4.xyz, 0).xyzw;
    r0.w = dot(r2.xyz, float3(0.333000004,0.333000004,0.333000004));
    r0.w = -0.300000012 + r0.w;
    r0.w = saturate(1.42857146 * r0.w);
    r3.xyzw = -r4.xyzw + r3.xyzw;
    r3.xyzw = r0.wwww * r3.xyzw + r4.xyzw;
    r2.xyz = saturate(r2.xyz);
    r0.w = cmp(g_FogDesc.vFogLayerSettings.w < 0.5);
    if (r0.w != 0) {
      r4.xyz = r3.xyz + -r0.xyz;
      r4.xyz = r2.xyz * r4.xyz + r0.xyz;
    }
    if (r0.w == 0) {
      r1.w = saturate(r1.w);
      r0.w = r3.w * r3.w;
      r5.xyz = g_FogDesc.vSunColor.xyz * r0.www + g_FogDesc.vAmbient.xyz;
      if (r1.y != 0) {
        r1.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r0.xyz;
        r1.xyz = r1.www * r1.xyz + r0.xyz;
        r6.xyz = r3.xyz + -r1.xyz;
        r4.xyz = r2.xyz * r6.xyz + r1.xyz;
      } else {
        r0.w = g_FogDesc.vFogLayerSettings.z * -g_FogDesc.vFogLayerPlane.w;
        r0.w = min(1, r0.w);
        r1.x = cmp(r0.w < 0.999899983);
        if (r1.x != 0) {
          r0.w = r0.w * r0.w;
          r1.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r0.xyz;
          r1.xyz = r1.www * r1.xyz + r0.xyz;
          r6.xyz = r3.xyz + -r1.xyz;
          r1.xyz = r2.xyz * r6.xyz + r1.xyz;
          r6.xyz = r3.xyz + -r0.xyz;
          r6.xyz = r2.xyz * r6.xyz + r0.xyz;
          r7.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r6.xyz;
          r6.xyz = r1.www * r7.xyz + r6.xyz;
          r6.xyz = r6.xyz + -r1.xyz;
          r4.xyz = r0.www * r6.xyz + r1.xyz;
        } else {
          r1.xyz = r3.xyz + -r0.xyz;
          r0.xyz = r2.xyz * r1.xyz + r0.xyz;
          r1.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r0.xyz;
          r4.xyz = r1.www * r1.xyz + r0.xyz;
        }
      }
    }
    o0.xyz = r4.xyz;
    o0.w = 1;
  }
  return;
}
